#pragma once

#include <atomic>
#include <memory>
#include "base_noncopyable.h"
#include "media_frame.h"

namespace El {
namespace Media {

class ISnap {

public:
    using Proc = std::function<void(const Media::MediaFramePtr &)>;

    virtual ~ISnap() = default;

    static ISnap &GetInstance(uint32_t ch, int32_t type);

    /**
     * @brief 启动抓图模块
     * @return true 成功，false 失败
     */
    virtual bool Start() = 0;

    /**
     * @brief 关闭抓图模块
     */
    virtual void Stop() = 0;

    /**
     * @brief 注册抓图回调
     * @param proc 回调函数
     * @return 返回handle，用于注销
     */
    virtual int32_t Register(const Proc &proc) = 0;

    /**
     * @brief 注销抓图回调
     * @param handle 回调句柄
     */
    virtual void Unregister(int32_t handle) = 0;

    /**
     * @brief 手动抓图
     * @param ch 通道号
     * @return true 成功，false 失败
     */
    virtual bool ManualSnap() = 0;
};

} // namespace Media
} // namespace El